home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib11.dsk
/
DISK DOCTOR.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
12KB
|
300 lines
10 REM **********************
11 REM * DISK DOCTOR *
12 REM * BY BEN COLLEY *
13 REM * COPYRIGHT (C) 1982 *
14 REM * BY MICROSPARC INC *
15 REM * LINCOLN, MA 01773 *
16 REM **********************
18 GOSUB 10000
20 FOR I = 1 TO 2 STEP 0
30 GOSUB 500
40 ON SEL GOSUB 1000,2000,3000,4000,5000,6000
50 NEXT
60 TEXT : HOME : END
500 HOME
505 VTAB 5: HTAB 15: INVERSE : PRINT " OPTIONS ": NORMAL
510 VTAB 8
520 HTAB 12: PRINT "1) DUMP SECTOR": PRINT
530 HTAB 12: PRINT "2) ZAP SECTOR": PRINT
540 HTAB 12: PRINT "3) RECOVER FILE": PRINT
550 HTAB 12: PRINT "4) REMOVE DOS": PRINT
560 HTAB 12: PRINT "5) SET DRIVE PARMS": PRINT
570 HTAB 12: PRINT "6) END": PRINT
580 FOR XX = 1 TO 2 STEP 0: VTAB 22: INPUT "ENTER SELECTION:";S$: IF S$ >"0" AND S$ <"7" THEN XX = 2
590 NEXT
600 SEL = VAL(S$): RETURN
1000 HOME
1010 FOR XX = 1 TO 2 STEP 0: VTAB 7: HTAB 5: INPUT "ENTER TRACK:";S$:TRK = VAL(S$): IF TRK > -1 AND TRK <35 AND S$ < >"" THEN XX = 2
1020 IF NOT (S$ > = "0" AND S$ < = "9") THEN XX = 1
1030 NEXT
1040 FOR XX = 1 TO 2 STEP 0: VTAB 9: HTAB 5: INPUT "ENTER SECTOR:";S$:SEC = VAL(S$): IF SEC > -1 AND SEC <16 AND S$ < >"" THEN XX = 2
1050 IF NOT (S$ > = "0" AND S$ < = "9") THEN XX = 1
1060 NEXT
1070 FOR XX = 1 TO 2 STEP 0: VTAB 11: HTAB 5: INPUT "LIST ON PRINTER? (Y/N):";S$: IF S$ = "Y" OR S$ = "N" THEN XX = 2
1080 NEXT
1090 POKE ITRK,TRK: POKE ISEC,SEC
1100 POKE ICMD,RD: CALL RWTS
1110 IF PEEK(IERR) < >0 THEN GOSUB 11000: RETURN
1120 IF S$ = "Y" THEN INC = 16: PRINT CHR$(4);"PR#1": PRINT CHR$(9);"80N";: PRINT "TRACK=";TRK;" SECTOR=";SEC: PRINT
1130 IF S$ = "N" THEN INC = 8: HOME : PRINT " TRACK=";TRK;" SECTOR=";SEC: PRINT
1140 FOR XX = BUF TO BUF +256 -INC STEP INC
1150 IF XX = BUF +128 AND S$ = "N" THEN VTAB 22: INPUT "PRESS RETURN TO CONTINUE:";X$: VTAB 5: CALL ESCF
1160 POKE BYTE,XX -BUF: CALL PRBYTE
1170 PRINT ": ";
1180 FOR XY = 0 TO INC -1
1190 POKE BYTE, PEEK(XX +XY): CALL PRBYTE: REM PRINT 1 BUFFER BYTE
1200 IF INT(XY/2) *2 < >XY THEN PRINT " ";
1210 NEXT
1220 PRINT " :";
1230 FOR XY = 0 TO INC -1
1240 XZ = PEEK(XX +XY): IF XZ >127 THEN XZ = XZ -128
1250 IF XZ <32 THEN XZ = 46
1260 PRINT CHR$(XZ);
1270 NEXT
1280 PRINT ":": NEXT
1290 IF S$ = "N" THEN VTAB 22: INPUT "PRESS RETURN TO CONTINUE:";X$
1300 IF S$ = "Y" THEN PRINT : PRINT : PRINT CHR$(4);"PR#0"
1310 RETURN
2000 HOME
2005 FOR XX = 1 TO 2 STEP 0: VTAB 7: HTAB 5: INPUT "ENTER TRACK:";S$:TRK = VAL(S$): IF TRK > -1 AND TRK <35 AND S$ < >"" THEN XX = 2
2010 IF NOT (S$ > = "0" AND S$ < = "9") THEN XX = 1
2015 NEXT
2020 FOR XX = 1 TO 2 STEP 0: VTAB 9: HTAB 5: INPUT "ENTER SECTOR:";S$:SEC = VAL(S$): IF SEC > -1 AND SEC <16 AND S$ < >"" THEN XX = 2
2025 IF NOT (S$ > = "0" AND S$ < = "9") THEN XX = 1
2030 NEXT
2035 POKE ITRK,TRK: POKE ISEC,SEC
2040 POKE ICMD,RD: CALL RWTS
2045 IF PEEK(IERR) < >0 THEN GOSUB 11000: RETURN
2050 HOME : PRINT " TRACK=";TRK;" SECTOR=";SEC: PRINT
2055 VTAB 22: HTAB 1: PRINT " >AGE FLIP >OVE >DIT >RITE >EXIT";
2060 INVERSE : HTAB 1: VTAB 22
2065 PRINT "P";: HTAB 13:: PRINT "M";: HTAB 20: PRINT "E";: HTAB 27: PRINT "W";: HTAB 35: PRINT "X";
2070 NORMAL
2075 B1 = 0:B2 = 128:T = -128: GOSUB 2800
2080 VK = 1:SEL = 13: REM MODE=MOVE
2085 FOR XX = 1 TO 2 STEP 0
2090 IF VK = 0 THEN GOSUB 2975
2095 IF SEL = 5 THEN GOSUB 2400
2100 IF SEL = 13 THEN GOSUB 2700
2105 IF SEL = 16 THEN B1 = B1 +T:B2 = B2 +T: GOSUB 2800
2110 IF SEL = 23 THEN XX = 2
2115 IF SEL = 24 THEN XX = 2
2120 NEXT
2125 IF SEL = 23 THEN POKE ICMD,WR: CALL RWTS: IF PEEK(IERR) < >0 THEN GOSUB 11000
2130 RETURN
2393 REM
2395 REM EDIT MODE
2398 REM
2400 VTAB 3: HTAB 34: INVERSE : PRINT "EDIT";: NORMAL
2402 VTAB 24: HTAB 6: PRINT "<0-F>-HEX DIGIT OR <-, ->";
2405 FOR XY = 1 TO 2 STEP 0
2410 HT = HT +1: REM MOVE TO NEXT NIBBLE
2415 IF HT >24 THEN HT = 6:VT = VT +1: IF VT >20 THEN VT = 5
2420 IF INT(HT/5) *5 = HT THEN HT = HT +1: REM CHECK FOR COL 10,15,20
2425 GOSUB 2975:VK = 0
2430 IF (S$ > = "0" AND S$ < = "9") OR (S$ > = "A" AND S$ < = "F") THEN GOSUB 2500:VK = 1
2435 IF SEL = 13 THEN VK = 1:XY = 2: REM SWITCH TO MOVE
2440 IF SEL = 16 THEN B1 = B1 +T:B2 = B2 +T: GOSUB 2800: REM PAGE FLIP
2445 IF SEL = 23 THEN VK = 1:XY = 2: REM EXIT
2450 IF SEL = 24 THEN VK = 1:XY = 2: REM WRITE
2455 IF SEL = 21 THEN VK = 1: REM RIGHT ARROW
2460 IF SEL = 8 THEN VK = 1:HT = HT -2: IF HT <5 THEN HT = 24:VT = VT -1: IF VT <5 THEN VT = 20: REM LEFT ARROW
2465 IF SEL = 8 AND ( INT((HT +1)/5) *5 = HT +1) THEN HT = HT -1: REM CHECK COL 10,15,20
2470 IF VK = 0 THEN HT = HT -1: REM NO VALID KEY
2475 NEXT
2480 REM SET HT TO NEXT CELL BEFORE LEAVING
2485 HT = INT((HT +4)/5) *5: IF HT >20 THEN HT = 5:VT = VT +1: IF VT >20 THEN VT = 5
2488 VTAB 24: HTAB 1: PRINT SPC( 35);
2490 RETURN
2495 REM PREPARE FOR AND CALL ZAP
2496 REM CALC BUFFER DISPLACEMENT
2500 X1 = (VT -5) *8 +ZTBL(HT -6) -30
2505 IF PEEK(1536) = 184 THEN X1 = X1 +128: REM NIBBLE IN 2ND HALF OF SECTOR
2510 POKE BDISP,X1
2515 BIT = 0
2520 IF ZTBL(HT -6) = ZTBL(HT -5) THEN BIT = 128: REM DET IF LEFT NIBBLE
2525 IF S$ < = "9" THEN POKE BYTE, VAL(S$) +BIT
2530 IF S$ > = "A" THEN POKE BYTE, ASC(S$) -55 +BIT
2535 CALL ZAP: REM ZAP THE NIBBLE
2540 REM NOW UPDATE DISPLAY
2544 VTAB VT
2545 HTAB HT: PRINT S$;: REM PRINT NIBBLE
2550 X1 = PEEK(BUF +X1): REM GET NEW VALUE
2555 VTAB VT: HTAB ZTBL(HT -6): REM POS FOR CHAR
2560 IF X1 >127 THEN X1 = X1 -128
2565 IF X1 <32 THEN X1 = 46
2570 PRINT CHR$(X1);: REM PRINT CHARACTER
2575 RETURN
2685 REM
2690 REM MOVE MODE
2695 REM
2700 VTAB 3: HTAB 34: INVERSE : PRINT "MOVE";: NORMAL
2705 VTAB 24: HTAB 3: PRINT "<I>-UP <M>-DOWN <J>-LEFT <K>-RIGHT";
2710 FOR XY = 1 TO 2 STEP 0
2715 GOSUB 2975:VK = 0
2720 IF S$ = "K" THEN HT = HT +5: IF HT >20 THEN HT = 5:VT = VT +1: IF VT >20 THEN VT = 5
2725 IF S$ = "J" THEN HT = HT -5: IF HT <5 THEN HT = 20:VT = VT -1: IF VT <5 THEN VT = 20
2730 IF S$ = "I" THEN VT = VT -1: IF VT <5 THEN VT = 20
2735 IF S$ = "M" THEN VT = VT +1: IF VT >20 THEN VT = 5
2740 IF SEL = 5 THEN VK = 1:XY = 2
2745 IF SEL = 16 THEN B1 = B1 +T:B2 = B2 +T: GOSUB 2800
2750 IF SEL = 23 THEN VK = 1:XY = 2
2755 IF SEL = 24 THEN VK = 1:XY = 2
2760 NEXT
2765 VTAB 24: PRINT SPC( 38);
2770 RETURN
2800 POKE 35,21: VTAB 5: HTAB 1: CALL ESCF: POKE 35,24: REM CLEAR MIDDLE OF SCREEN
2805 FOR X1 = BUF +B1 TO BUF +B2 -8 STEP 8
2810 POKE BYTE,X1 -BUF: CALL PRBYTE
2815 PRINT ": ";
2820 FOR X2 = 0 TO 7
2825 POKE BYTE, PEEK(X1 +X2): CALL PRBYTE
2830 IF INT(X2/2) *2 < >X2 THEN PRINT " ";
2835 NEXT
2840 PRINT " :";
2845 FOR X2 = 0 TO 7
2850 X3 = PEEK(X1 +X2)
2855 IF X3 >127 THEN X3 = X3 -128
2860 IF X3 <32 THEN X3 = 46
2865 PRINT CHR$(X3);
2870 NEXT
2875 PRINT ":"
2880 NEXT
2885 T = -T
2890 VK = 0:SEL = 0:VT = 5:HT = 5: REM INIT CURSOR POSITION
2895 RETURN
2975 VTAB VT: HTAB HT: REM POSITION CURSOR
2980 GET S$: PRINT CHR$(0): REM PRINT NON-DISPLAY CHAR
2985 IF S$ < >"" THEN SEL = ASC(S$)
2990 IF S$ = CHR$(0) THEN SEL = 0
2995 RETURN
3000 FOR XX = 1 TO 2 STEP 0: HOME : VTAB 7
3010 HTAB 3: INPUT "ENTER FILE NAME:";S$
3020 IF LEN(S$) < >0 THEN XX = 2
3030 NEXT
3040 POKE ITRK,17
3050 XU = 0
3060 FOR XX = 15 TO 1 STEP -1
3070 POKE ISEC,XX
3080 POKE ICMD,RD: CALL RWTS
3090 IF PEEK(IERR) < >0 THEN GOSUB 11000: RETURN
3100 FOR XY = 11 TO 221 STEP 35
3110 IF PEEK(BUF +XY) = 255 THEN GOSUB 3500
3120 IF XU = 1 THEN POKE (BUF +XY), PEEK(BUF +XY +32): POKE (BUF +XY +32),160: POKE ICMD,WR: CALL RWTS:XY = 221:XX = 1: IF PEEK(IERR) < >0 THEN GOSUB 11000: RETURN
3130 IF PEEK(BUF +XY) + PEEK(BUF +XY +1) = 0 THEN XY = 221:XX = 1
3140 NEXT : NEXT
3150 VTAB 18: HTAB 5
3160 IF XU = 1 THEN PRINT "FILE RECOVERED IN VTOC": VTAB 20: HTAB 5: PRINT "REMEMBER TO LOAD AND SAVE IT"
3170 IF XU = 0 THEN PRINT " FILE NOT FOUND"
3180 FOR XX = 1 TO 1500: NEXT
3190 RETURN
3500 IF LEN(S$) <30 THEN S$ = S$ + MID$ (" ",1,30 - LEN(S$)): REM 30 SPACES
3510 XU = 1
3520 FOR XZ = 1 TO 29
3530 IF PEEK(BUF +XY +XZ +2) < > ASC( MID$ (S$,XZ,1)) +128 THEN XU = 0:XZ = 30
3540 NEXT
3550 RETURN
4000 REM REMOVE DOS
4010 HOME : VTAB 7
4020 PRINT " IF DOS IS REMOVED YOU CAN NOT BOOT THE": PRINT
4030 PRINT " DISK. DO YOU WANT TO CONTINUE? (Y/N)"
4040 FOR XX = 1 TO 2 STEP 0
4050 VTAB 9: HTAB 39: INPUT "";S$
4060 IF S$ = "N" OR S$ = "Y" THEN XX = 2
4070 NEXT
4080 IF S$ = "N" THEN RETURN
4090 POKE ITRK,17: POKE ISEC,0
4100 POKE ICMD,RD: CALL RWTS: REM READ THE VTOC
4110 IF PEEK(IERR) < >0 THEN GOSUB 11000: RETURN
4120 POKE BUF +56,0: POKE BUF +57,0: REM TRK 0 NOT AVAILABLE
4130 FOR XX = 60 TO 64 STEP 4: POKE BUF +XX,255: POKE BUFF +XX +1,255: NEXT
4140 POKE ICMD,WR: CALL RWTS
4150 IF PEEK(IERR) < >0 THEN GOSUB 11000: RETURN
4160 FOR XX = 1 TO 118: POKE BUF +XX -1,NDB(XX): NEXT
4170 FOR XX = 118 TO 255: POKE BUF +XX,0: NEXT
4180 POKE ITRK,0: POKE ISEC,0
4190 CALL RWTS: REM WRITE BOOT SECTOR
4200 IF PEEK(IERR) < >0 THEN GOSUB 11000
4210 RETURN
5000 HOME : VTAB 6
5010 HTAB 10: PRINT "CURRENT SLOT:"; PEEK(IBSL)/16: PRINT
5020 HTAB 9: PRINT "CURRENT DRIVE:"; PEEK(IDRV): PRINT
5030 FOR XX = 1 TO 2 STEP 0: VTAB 12: HTAB 14: INPUT "NEW SLOT:";S$:S$ = LEFT$(S$,1): IF S$ >"0" AND S$ <"8" THEN XX = 2
5040 NEXT
5050 POKE IBSL, VAL(S$) *16
5060 FOR XX = 1 TO 2 STEP 0: VTAB 14: HTAB 13: INPUT "NEW DRIVE:";S$:S$ = LEFT$(S$,1): IF S$ >"0" AND S$ <"3" THEN XX = 2
5070 NEXT
5080 POKE IDRV, VAL(S$)
5090 RETURN
6000 I = 2: RETURN
10000 REM ***** SETUP *****
10010 REM INSTALL INTERFACES
10020 FOR XX = 770 TO 833: READ XY: POKE XX,XY: NEXT
10030 CALL 770: REM GET IOB ADDR
10040 IOB = PEEK(6) +( PEEK(7) *256)
10050 IBSL = IOB +1
10060 IDRV = IOB +2
10070 IVOL = IOB +3
10080 ITRK = IOB +4
10090 ISEC = IOB +5
10100 ICMD = IOB +12
10110 IERR = IOB +13
10120 IAVOL = IOB +14
10130 BUF = PEEK(IOB +8) +( PEEK(IOB +9) *256)
10140 POKE IVOL,0: REM CLEAR VOLUME ID
10150 RWTS = 780
10160 RD = 1:WR = 2
10170 TEXT : HOME
10180 PRINT " * * * * DISK DOCTOR * * * * ": POKE 34,2
10190 PRBYTE = 800
10200 ESCF = 64578
10210 BYTE = 8
10220 ZAP = 810:BDISP = 26: REM ZAP VARIABLES
10230 POKE 27, PEEK(IOB +8): POKE 28, PEEK(IOB +9)
10240 DIM NDB(118)
10250 FOR XX = 1 TO 118: READ NDB(XX): NEXT
10260 DIM ZTBL(19)
10270 FOR I = 0 TO 19: READ ZTBL(I): NEXT
10280 RETURN
10290 REM RWTS INTERFACE
10300 DATA 32,227,3,133,7,132,6,96,234,234
10310 DATA 165,7,164,6,32,217,3,176,6
10320 DATA 169,0,160,13,145,6,96
10330 DATA 234,234,234,234
10340 REM MONITOR PRBYTE INTERFACE
10350 DATA 165,8,32,218,253,96
10360 REM NIBBLE ZAP ROUTINE
10370 DATA 234,234,234,234,162,240,165,8,16
10380 DATA 8,10,10,10,10,133,8,162,15,138
10390 DATA 164,26,49,27,5,8,145,27,96
10400 REM BOOT ROUTINE WHEN DOS REMOVED
10410 DATA 1,157,136,192,142,244,3,138,74
10420 DATA 74,74,74,9,192,141,45,8,165
10430 DATA 0,141,44,8,32,96,251,162,0
10440 DATA 189,46,8,240,6,32,240,253,232
10450 DATA 208,245,32,111,253,108,44,8,0
10460 DATA 0,141,141,160,160,160,160,160,160
10470 DATA 160,160,160,206,207,160,196,207,211
10480 DATA 160,207,206,160,212,200,201,211,160
10490 DATA 196,201,211,203,141,141,160,160,201
10500 DATA 206,211,197,210,212,160,196,201,211
10510 DATA 203,160,215,201,212,200,160,196,207
10520 DATA 211,160,193,206,196,160,208,210,197
10530 DATA 211,211,160,210,197,212,213,210,206
10540 DATA 0
10550 REM
10560 REM TAB TABLE FOR ZAP
10570 REM
10580 DATA 30,30,31,31,0,32,32,33,33,0,34,34,35,35,0,36,36,37,37,0
10970 REM
10980 REM ---- DISK ERROR HANDLER ----
10990 REM
11000 HOME :XX = PEEK(IERR)
11010 IF XX = 16 THEN S$ = " DISK IS WRITE PROTECTED "
11020 IF XX = 32 THEN S$ = " VOLUME MISMATCH "
11030 IF XX = 64 THEN S$ = " I/O ERROR "
11040 IF XX = 128 THEN S$ = " READ ERROR "
11050 INVERSE : VTAB 7: HTAB 8: PRINT SPC( 25): VTAB 8: HTAB 8: PRINT S$: VTAB 9: HTAB 8: PRINT SPC( 25)
11060 FOR XX = 1 TO 2500: NEXT
11070 NORMAL
11080 RETURN